#ifndef __FILE_H
#define __FILE_H
#define AT_FDCWD -100
struct iovec
{
  void * iov_base; /* Starting address */
  size_t iov_len;  /* Number of bytes to transfer */
};

struct file {
  enum { FD_NONE, FD_PIPE, FD_ENTRY, FD_DEVICE } type;
  int ref; // reference count
  char readable;
  char writable;
  struct pipe *pipe; // FD_PIPE
  // struct inode *ip;  // FD_INODE and FD_DEVICE
  struct dirent *ep;
  uint off;          // FD_ENTRY
  short major;       // FD_DEVICE
};

#define major(dev)  ((dev) >> 16 & 0xFFFF)
#define minor(dev)  ((dev) & 0xFFFF)
#define	mkdev(m,n)  ((uint)((m)<<16| (n)))

// in-memory copy of an inode
// struct inode {
//   uint dev;           // Device number
//   uint inum;          // Inode number
//   int ref;            // Reference count
//   struct sleeplock lock; // protects everything below here
//   int valid;          // inode has been read from disk?

//   short type;         // copy of disk inode
//   short major;
//   short minor;
//   short nlink;
//   uint size;
//   uint addrs[NDIRECT+1];
// };

// map major device number to device functions.
struct devsw {
  int (*read)(int, uint64, int);
  int (*write)(int, uint64, int);
};
typedef long long int64;
struct linux_dirent64 {
        uint64        d_ino;        /* 64-bit inode number */
        int64         d_off;        /* 64-bit offset to next structure */
        unsigned short  d_reclen;   /* Size of this dirent */
        unsigned char   d_type;     /* File type */
        char            d_name[25]; /* Filename (null-terminated) */
};

/* these are defined by POSIX and also present in glibc's dirent.h */
#define DT_UNKNOWN	0
#define DT_FIFO		1
#define DT_CHR		2
#define DT_DIR		4
#define DT_BLK		6
#define DT_REG		8
#define DT_LNK		10
#define DT_SOCK		12
#define DT_WHT		14


extern struct devsw devsw[];

#define CONSOLE 1

#endif
